Flight Club
Flight Club is an automated flight deal scanner that watches a list of destinations and their price thresholds, then notifies you the moment a fare drops below your target. It queries Google Flights via SerpApi, reads destination data from a Google Sheet through Sheety, and delivers alerts over WhatsApp (Twilio) and email (Gmail SMTP). The project ships in two builds: an original version faithful to the course exercise, and a refactored advanced build with all constants in config.py, a clean Notifier class, and launch-directory-independent path handling.
Quick Facts
Overview
Problem
Flight prices fluctuate constantly and checking manually across multiple destinations is tedious and unreliable — you either check too late or miss the window entirely. The course exercise that inspired this project originally used the Amadeus test API, which was decommissioned in early 2026, leaving the project non-functional out of the box. Beyond that, most flight alert tools are web apps with account friction; what I wanted was a lightweight script I could run locally, pointed at my own Google Sheet, with no subscription required. The challenge was finding a replacement API that was actually working, free at a useful tier, and didn't require an OAuth2 flow just to get started.
Solution
The app reads destination cities, IATA codes, and price thresholds from a Google Sheet via Sheety, which wraps the sheet as a REST API. For each destination it queries SerpApi's Google Flights engine, first searching for direct flights and falling back to connections if none are found. Results are parsed into FlightData objects, the cheapest is identified, and if it beats the threshold a formatted alert is sent via Twilio's WhatsApp sandbox and Gmail SMTP. The advanced build separates concerns cleanly: DataManager owns Sheety I/O, FlightSearch owns SerpApi, Notifier is a pure I/O class that accepts plain strings, and all magic numbers live in config.py.
Challenges
The hardest problem was that the original API was being decommissioned mid-project, returning 500s on every call, which meant finding and integrating a replacement from scratch. I evaluated several alternatives before landing on SerpApi, which scrapes Google Flights and returns real prices with a simple API key and no OAuth2 flow. SerpApi's data model is also different from a traditional flights API: it takes a specific outbound and return date rather than a date range, and it has no IATA lookup endpoint, so airport codes have to be pre-filled in the sheet manually. Parsing the nested response structure (best_flights, other_flights, and layovers arrays) cleanly into FlightData objects also required careful handling to avoid KeyError crashes on missing fields.
Results / Metrics
The project is fully functional: it scans the sheet, searches Google Flights in real time, and delivers WhatsApp and email alerts when a deal lands. I came away with a much deeper understanding of multi-API orchestration, specifically what it actually takes to swap one external service for another cleanly without rewiring everything else. The two-build structure was a deliberate choice to show the before/after of a refactor: same logic, cleaner architecture, easier to extend. If I were taking it further, I'd add a date-range loop so each run checks multiple departure windows rather than a single fixed date, and I'd look at scheduling it as a daily cron job so it runs without me having to remember to trigger it.
Screenshots
Click to enlarge.
Click to enlarge.
Videos
No videos available yet.